Designing Data-intensive Applications
https://gyazo.com/7e20ccd5d67b058f65018cf29001ac42
ストレージとデータ処理技術に関する基礎概念について、原理と実践の両方の観点を通して、読者がdata-intensive applicationsを構築するための技術選択の意思決定を助ける本である。
https://www.youtube.com/watch?v=P-9FwZxO1zE
Martin Kleppmannが2017年に出版した「Designing Data-Intensive Applications」という本は、データシステムの設計に関する質問の仕方を教えることを目的としている。
2013年から今日にかけての大きな変化の一つは、クラウドサービスの台頭。個々のマシンではなく、サービスを組み合わせてシステムを構築するようになった。
本の改訂第2版では、クラウドネイティブの観点がどのように物事を変えるかを取り入れようとしている。
本の内容の多くは時代を超えて通用するもの。トランザクションや一貫性モデル、レプリケーション、パーティショニングの基本は30年間あまり変わっていない。
スタートアップには、スケーラビリティよりも変更のしやすさを重視するよう助言。一般的な技術を選ぶことで、市場やユーザーについて学んだことに適応しやすくなる。
現在、Kleppmann はミュンヘン工科大学でコラボレーションソフトウェアの研究を行っている。データをユーザーのデバイスに保存し、サーバーはデータの同期とバックアップのみを行うような、よりユーザー中心のシステムを目指している。
データエンジニアへのアドバイスとして、使用しているシステムの内部についてある程度学ぶことが重要。パフォーマンスが悪化した際に何が起こっているのかを視覚化できるようになる。
和訳が出る
過去にCAP定理という言葉が流行り、あたかもこれが分散システム設計の前提という風潮になったこともありましたが、この本ではCAP定理を(その対象となるシステムの狭さから)実用上有益ではないと言い切り明確に終止符を打っています。過去の文献を読むだけでは、このように忘れ去るべき知識についての情報は得られないので、知識をリフレッシュする意味でも本書は役に立つでしょう。実際、CAP定理が話題になると、この本を紹介するだけで話が終わるようになり便利になりました。 目次
第I部 データシステムの基礎
1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
1.1 データシステムに関する考察
1.2 信頼性
1.2.1 ハードウェアの障害
1.2.2 ソフトウェアのエラー
1.2.3 ヒューマンエラー
1.2.4 信頼性の重要度
1.3.1 負荷の表現
1.3.2 パフォーマンスの表現
1.3.3 負荷への対処のアプローチ
1.4 メンテナンス性
1.4.1 運用性:運用担当者への配慮
1.4.2 単純さ:複雑さの管理
1.4.3 進化性:変更への配慮
まとめ
2章 データモデルとクエリ言語
2.1 リレーショナルモデルとドキュメントモデル
2.1.2 オブジェクトとリレーショナルのミスマッチ
2.1.3 多対一と多対多の関係
2.1.4 ドキュメントデータベースは歴史を繰り返すのか?
2.1.5 今日のリレーショナルデータベースとドキュメントデータベース
2.2 データのためのクエリ言語
2.2.1 Web上での宣言的クエリ
2.3 グラフ型のデータモデル
2.3.1 プロパティグラフ
2.3.3 SQLでのグラフクエリ
まとめ
3章 ストレージと抽出
3.1 データベースを駆動するデータ構造
3.1.5 その他のインデックス構造
3.2 トランザクション処理か、分析処理か?
3.2.1 データウェアハウス
3.3.1 列の圧縮
3.3.2 列ストレージにおけるソート順序
3.3.3 列指向ストレージへの書き込み
3.3.4 集計:データキューブとマテリアライズドビュー
まとめ
4章 エンコーディングと進化
4.1 データエンコードのフォーマット
4.1.1 言語固有のフォーマット
4.1.2 JSON、XML、様々なバイナリフォーマット
4.1.5 スキーマのメリット
4.2 データフローの形態
4.2.1 データベース経由でのデータフロー
4.2.3 メッセージパッシングによるデータフロー
まとめ
第II部 分散データ
II.1 高負荷に対応するスケーリング
II.2 レプリケーションとパーティショニング
5.1 リーダーとフォロワー
5.1.1 同期と非同期のレプリケーション
5.1.2 新しいフォロワーのセットアップ
5.1.3 ノード障害への対処
5.1.4 レプリケーションログの実装
5.2 レプリケーションラグにまつわる問題
5.2.1 自分が書いた内容の読み取り
5.2.2 モノトニックな読み取り
5.2.3 一貫性のあるプレフィックス読み取り
5.2.4 レプリケーションラグへの対処方法
5.3.1 マルチリーダーレプリケーションのユースケース
5.3.2 書き込みの衝突の処理
5.3.3 マルチリーダーレプリケーションのトポロジー
5.4 リーダーレスレプリケーション
5.4.1 ノードがダウンしている状態でのデータベースへの書き込み
5.4.2 クオラムの一貫性の限界
5.4.4 並行書き込みの検出
まとめ
6.1 パーティショニングとレプリケーション
6.2 キー‐バリューデータのパーティショニング
6.2.1 キーの範囲に基づくパーティショニング
6.2.2 キーのハッシュに基づくパーティショニング
6.2.3 ワークロードのスキューとホットスポットの軽減
6.3 パーティショニングとセカンダリインデックス
6.3.1 ドキュメントによるセカンダリインデックスでのパーティショニング
6.3.2 語によるセカンダリインデックスでのパーティショニング
6.4 パーティションのリバランシング
6.4.1 リバランスの戦略
6.4.2 運用:自動のリバランスと手動のリバランス
6.5 リクエストのルーティング
6.5.1 パラレルクエリの実行
まとめ
7章 トランザクション
7.1 トランザクションというとらえどころのない概念
7.1.2 単一オブジェクトと複数オブジェクトの操作
7.2.3 更新のロストの回避
7.2.4 書き込みスキューとファントム
7.3 直列化可能性
7.3.1 完全な順次実行
7.3.2 ツーフェーズ(2相)ロック(2PL)
7.3.3 直列化可能なスナップショット分離(SSI)
まとめ
8章 分散システムの問題
8.1 フォールトと部分障害
8.1.1 クラウドコンピューティングとスーパーコンピューティング
8.2 信頼性の低いネットワーク
8.2.1 ネットワークのフォールトの実際
8.2.2 フォールトの検出
8.2.3 タイムアウトと限度のない遅延
8.2.4 同期ネットワークと非同期ネットワーク
8.3 信頼性の低いクロック
8.3.1 単調増加のクロックと時刻のクロック
8.3.2 クロックの同期と正確性
8.3.4 プロセスの一時停止
8.4 知識、真実、虚偽
8.4.3 システムモデルと現実
まとめ
9章 一貫性と合意
9.1 一貫性の保証
9.2 線形化可能性
9.2.2 線形化可能性への依存
9.2.3 線形化可能なシステムの実装
9.2.4 線形化可能にすることによるコスト
9.3.1 順序と因果関係
9.3.2 シーケンス番号の順序
9.3.3 全順序のブロードキャスト
9.4.1 アトミックなコミットと2相コミット(2PC)
9.4.2 分散トランザクションの実際
9.4.4 メンバーシップと協調サービス
まとめ
第III部 導出データ
III.1 記録のシステム(Systems of Record)と導出データ
III.2 各章の概要
10章 バッチ処理
10.1 Unixのツールによるバッチ処理
10.1.1 単純なログの分析
10.1.2 Unixの哲学
10.2.1 MapReduceジョブの実行
10.2.2 Reduce側での結合とグループ化
10.2.3 map側での結合(map-side join)
10.2.4 バッチワークフローの出力
10.3 MapReduceを超えて
10.3.1 中間的な状態の実体化
10.3.2 グラフとイテレーティブな処理
10.3.3 高レベルAPIと様々な言語
まとめ
11.1.1 メッセージングシステム
11.1.2 パーティション化されたログ
11.2 データベースとストリーム
11.2.1 システムの同期の保持
11.2.2 変更データのキャプチャ
11.2.4 状態、ストリーム、イミュータビリティ
11.3 ストリームの処理
11.3.1 ストリーム処理の利用
11.3.2 時間に関する考察
11.3.3 ストリームの結合
11.3.4 耐障害性
まとめ
12章 データシステムの将来
12.1 データのインテグレーション
12.1.1 データの導出による特化したツールの組み合わせ
12.1.2 バッチ処理とストリーム処理
12.2 データベースを解きほぐす
12.2.1 データストレージ技術の組み合わせ
12.2.2 データフロー中心のアプリケーション設計
12.2.3 導出された状態の監視
12.3 正確性を求めて
12.3.1 データベースのエンドツーエンド論
12.3.2 制約の強制
12.3.3 適時性と整合性
12.3.4 信頼しつつも検証を
12.4 正しいことを行う
12.4.1 予測分析
12.4.2 プライバシーと追跡